Manon.icu

I'm here to make you a better developer by teaching you everything I know about building for the web.

Published 2022-04-14

Node.js - File System

Node.js提供了一个fs模块,用于操作文件系统。通过fs模块,可以读取文件,创建文件,删除文件,移动文件,复制文件等。

const fs = require('fs')

sync 和 async

fs模块中的每个方法都有syncasync两种形式。异步方法会返回一个Promise对象,而同步方法会返回一个callback

echo "hello world" > demo.txt
const fs = require('fs')

// 异步读取文件
fs.readFile('demo.txt', function (err, data) {
  if (err) {
    return console.error(err)
  }
  console.log('Asynchronous read: ' + data.toString())
})

// 同步读取文件
var data = fs.readFileSync('demo.txt')
console.log('Synchronous read: ' + data.toString())

console.log('Program Ended')

打开文件

语法:fs.open(path, flags, [mode], callback)

  • path: 文件路径
  • flags: 打开文件的方式,可以是rr+ww+aa+xx+tt+cc+
  • mode: 打开文件的模式,默认是0o666
  • callback: 回调函数,参数为 err,fd
const fs = require('fs')
fs.open('demo.txt', 'r', function (err, fd) {
  if (err) {
    return console.error(err)
  }
  console.log('文件打开成功,文件描述符:' + fd)
})

获取文件信息

语法:fs.stat(path, callback)

  • path: 文件路径
  • callback: 回调函数,参数为 err,stats

方法:

  • stats.isFile(): 判断是否是文件
  • stats.isDirectory(): 判断是否是目录
  • stats.isBlockDevice(): 判断是否是块设备
  • stats.isCharacterDevice(): 判断是否是字符设备
  • stats.isSymbolicLink(): 判断是否是符号链接
  • stats.isFIFO(): 判断是否是 FIFO,如果是 FIFO,则返回 true,否则返回 false
  • stats.isSocket(): 判断是否是 Socket
const fs = require('fs')
fs.stat('demo.txt', function (err, stats) {
  if (err) {
    return console.error(err)
  }
  console.log(stats)
  console.log('文件类型:' + stats.isFile())
  console.log('文件大小:' + stats.size)
  console.log('文件创建时间:' + stats.birthtime)
})

写入文件

语法:fs.writeFile(file, data, [options], callback)

  • file: 文件路径
  • data: 写入的数据
  • options: 可选参数,可以是encodingmodeflag
  • callback: 回调函数,参数为 err
const fs = require('fs')
fs.writeFile('demo.txt', '我是写入的文件内容', function (err) {
  if (err) {
    return console.error(err)
  }
  console.log('数据写入成功!')
  console.log('--------我是分割线-------------')
  console.log('读取写入的数据!')
  fs.readFile('demo.txt', function (err, data) {
    if (err) {
      return console.error(err)
    }
    console.log('异步读取文件数据: ' + data.toString())
  })
})

读取文件

语法:fs.read(fd, buffer, offset, length, position, callback)

  • fd:返回的文件描述符
  • buffer:数据被写入的缓冲区
  • offset:缓冲区写入的偏移位置
  • length:读取的字节数
  • position:从哪里开始读取
  • callbackerrbytesReadbuffer
var fs = require('fs')
var buf = new Buffer(1024)

console.log('Going to open an existing file')
fs.open('input.txt', 'r+', function (err, fd) {
  if (err) {
    return console.error(err)
  }
  console.log('File opened successfully!')
  console.log('Going to read the file')

  fs.read(fd, buf, 0, buf.length, 0, function (err, bytes) {
    if (err) {
      console.log(err)
    }
    console.log(bytes + ' bytes read')

    // Print only read bytes to avoid junk.
    if (bytes > 0) {
      console.log(buf.slice(0, bytes).toString())
    }
  })
})

关闭文件

语法:fs.close(fd, callback)

  • fd:返回的文件描述符
  • callback:回调函数,参数为 err
const fs = require('fs')
fs.open('demo.txt', 'r', function (err, fd) {
  if (err) {
    return console.error(err)
  }
  console.log('文件打开成功,文件描述符:' + fd)
  fs.close(fd, function (err) {
    if (err) {
      return console.error(err)
    }
    console.log('文件关闭成功!')
  })
})

删除文件

语法:fs.unlink(path, callback)

  • path:文件路径
  • callback:回调函数,参数为 err
const fs = require('fs')
fs.unlink('demo.txt', function (err) {
  if (err) {
    return console.error(err)
  }
  console.log('文件删除成功!')
})

创建目录

语法:fs.mkdir(path, [mode], callback)

  • path:目录路径
  • mode:目录权限
  • callback:回调函数,参数为 err
const fs = require('fs')
fs.mkdir('/tmp/test', function (err) {
  if (err) {
    return console.error(err)
  }
  console.log('目录创建成功!')
})

读取目录

语法:fs.readdir(path, callback)

  • path:目录路径
  • callback:回调函数,参数为 err、files
const fs = require('fs')
fs.readdir('/tmp', function (err, files) {
  if (err) {
    return console.error(err)
  }
  files.forEach(function (file) {
    console.log(file)
  })
})

阅读目录

语法:fs.readdirSync(path)

  • path:目录路径
const fs = require('fs')
fs.readdirSync('/tmp')

删除目录

语法:fs.rmdir(path, callback)

  • path:目录路径
  • callback:回调函数,参数为 err
const fs = require('fs')
fs.rmdir('/tmp/test', function (err) {
  if (err) {
    return console.error(err)
  }
  console.log('目录删除成功!')
})

入门教程 Node.js 文档

Comments

No Comments!